# -*- coding: utf-8 -*-
# @Time    : 2022/4/10 20:47
# @Author  : YanYajun

# class

# 我们想自定义一种新类型的元祖，对于传入的可迭代对象，我们只保留其中int类型且大于0的元素，例如：
# IntTuple([1, -1, 'abc', 6, ["x", "y"], 3]) => (1, 6, 3)
# 如何继承内置tuple实现IntTuple？


# 当一个class被实例化之前，首先会调用__new__方法
# class IntTuple(tuple):
#
#     def __new__(cls, args):
#         # print("enter __new__")
#         args = [i for i in args if isinstance(i, int) and i > 0]
#         return super().__new__(cls, args)
#
# def __init__(self,seq=()):
#     print("enter __init__")
#     return super(IntTuple, self).__init__(seq)
#
#
# a = tuple([1, -1, 'abc', 6, ["x", "y"], 3])
# print(a)
#
# t = IntTuple([1, -1, 'abc', 6, ["x", "y"], 3])
# print(t)  # (1, 6, 3)


# with

# with open('a.txt', 'w', encoding='utf-8') as f:
#     pass


# 1、如果我们让一个class 支持with方法
# 要满足的条件：
# 就是这个class必须有两个方法
# 1、__enter__
# 2、 __exit__
# 注意的一个点 with语句后面有一个as a,那这个a代表着enter的返回值 __enter__一定要返回self
# exc_type, exc_val, exc_tb 只有在代码报错的情况下 才会有值
# <class 'KeyError'> 'key值有错' <traceback object at 0x00000203EB2C9DC8>

# 比如说我们要连接数据库  我要连接数据库 执行我们的sql  最后我们要断开数据库
"""
1、导包 import pymysql
2、创建连接 conn = pymysql.connect()
3、获取游标 cursor=conn.Cursor()
4、执行SQL cursor.excute("sql语句")
查询语句（select）

处理结果集（提取数据fetch*;
fetchone 一条结果;
fetchmany（size）：从结果集中，提取size行;
fetchall()：提取所有结果集）

增删改语句（insert，delete、updata）
成功：提交事务 conn.commit()
失败：回滚业务 conn.rollback()
5、关闭游标 cursor.close()
6、关闭连接 conn.close()
"""
import pymysql

#1创建连接
conn= pymysql.connect(
    host='127.0.0.1',
    user="root",
    password="123456",
    db="mytest",
    port=3306,
    charset='utf8',
)

# 2获取游标
cursor = conn.cursor()

#3 执行sql
""""查询操作"""
sql ='select * from b'
cursor.execute(sql)


""""新增操作"""
# sql='insert into b VALUES(1006,"数据结构导论123",111)'
# cursor.execute(sql)
# #增加插入操作需要提交操作
# conn.commit()

""""修改操作"""
# sql='update b  set bname="数据结构导论1122" where bno="1006"'
# cursor.execute(sql)
# #增加插入操作需要提交操作
# conn.commit()
#
# """删除操作"""
# sql='delete from b where bno ="1006"'
# cursor.execute(sql)
#增加插入操作需要提交操作
# conn.commit()

#失败：回滚业务 conn.rollback()
# conn.rollback()
conn.commit()

#4获取结果

res=cursor.fetchall()
for res1 in res:
    print(res1)


#5关闭游标，断开连接
cursor.close()
cursor.close()























# 使用with方式实现
# class DB():
#     def __enter__(self):
#         print("连接数据库")
#         return self
#
#     def __exit__(self, exc_type, exc_val, exc_tb):
#         print("断开数据库")
#         # if issubclass(exc_type, ConnectionResetError):
#         #     return True
#
#     def select(self, sql):
#         print(f"执行{sql}成功")
#
#
# with DB() as db:
#     db.select('sql')























# 在某项目中，我们实现一些类，并希望能像静态类型语言那样（C,C++,Java）对他们的实例属性做类型检查
# p = Person()
# p.name = "Bob" #必须是str
# p.age = 18 #必须是int
# p.height = 171 #必须是float
# 要求：
# 1、对于实例属性指定类型
# 2、赋予不正确类型时抛出异常

#
# # python 中的描述符  （__set__ __get__ __delete__）
# class Attr():
#
#     def __init__(self, key, _type):
#         self.key = key
#         self._type = _type
#
#     def __set__(self, instance, value):
#         # 如果类型不是我要的类型的话 抛出异常
#         if not isinstance(value, self._type):
#             raise TypeError(f"{self.key} must be {self._type}")
#
#         instance.__dict__[self.key] = value
#
#     def __get__(self, instance, owner):
#         # 读取一下 key 对于的vaule值
#         return instance.__dict__[self.key]
#
#     def __delete__(self, instance):
#         # 删除一下 key vaule
#         # instance == son
#         del instance.__dict__[self.key]
#
#
# class People():
#     age = Attr('age', int)
#     name = Attr("name", str)
#     height = Attr("height", float)
#     # age = 123
#
#
# son = People()
# son.age = 122
# son.name = '"bon"'
# son.height = '1.233232'
